/**
  * Author: Mei
  * Date: 2020-10-15 10:04
  * Description: 
  *
  */
#include <iostream>
#include <cstring>

using namespace std;

/**
 * 运算符重载
 * @return
 */
class String {
private:
    char *p;
public:
    String() {
        p = NULL;
    }

    String(char *str);

    void display();
};

String::String(char *str) {
    p = new char(strlen(str) + 1);
    strcpy(p, str);
}

void String::display() {
    cout << p;
}

//Time类 前置++和后置++
class Time {
private:
    int minute;
    int sec;
public:
    Time() {
        minute = 0;
        sec = 0;
    }

    Time(int m, int s) : minute(m), sec(s) {}

    Time operator++(); //前置++ ++i
    Time operator++(int); //有参数的是后置++ i++

    void display() {
        cout << minute << "." << sec << endl;
    }

};

//前置++
Time Time::operator++() { //++i
    if ((++sec) >= 60) {
        sec -= 60;
        ++minute;
    }
    return *this;
}
Time Time::operator++(int) { //i++
    Time temp(*this); //先取值 再++  以当前对象构造出另一个对象
    (this->sec)++;
    if (sec >= 60) {
        sec -= 60;
        ++minute;
    }
    return temp; //返回++之前的对象  而调用的对象的sec已经++完了
}

int main() {
    //友元函数的运算符重载必须要有两个参数
    //一般单目运算符为成员函数 !, ++, --，双目运算符重载为友元函数 +, -, ==, &&
    //定义友元函数时 不能使用Complex::operator+()作用域限定
    //String t1("hello");
    //String t2(" world");
    //t1.display();
    //t2.display();
    Time t1(1, 2);
    (t1++).display(); //调用后置++
    t1.display();
    Time t2(3, 4);
    (++t2).display(); //调用前置++
    t2.display();

    /**
     * 前置++和后置++效率
     * 由于后置++需要创建一个对象来保存之前的对象 比较浪费内存 效率比较低下
     *
     */

    return 0;
}